// 服务的的入口文件
// 需要安装几个模块：multer上传,sqlite3方便服务端的移植,uuid唯一标识  ,直接npm install 模块名
const express = require('express') //引入
const multer = require('multer') //引入上传
const app = express() //实例化注册
const path = require('path')
const port = 8080
const { db, genid } = require('./db/DbUtils') //引入雪花id和数据库

//开放跨域请求，跨域请求放在在中间件的上面
app.use(function (req, res, next) {
  //设置允许跨域的域名，*代表允许任意域名跨域
  res.header('Access-Control-Allow-Origin', '*')
  //允许的header类型
  res.header('Access-Control-Allow-Headers', '*')
  //跨域允许的请求方式
  res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
  if (req.method == 'OPTIONS') res.sendStatus(200) //让options尝试请求快速结束
  else next()
})

app.use(express.json()) //中间件
const update = multer({
  //上传的文件地址
  dest: './public/upload/temp',
})

app.use(update.any()) //允许所有上传
// 指定静态资源路径
app.use(express.static(path.join(__dirname, 'public')))

// category/_token/add  只要接口路径里面含有一个/_token的标记,就进行一个token的校验
const ADMIN_TOKEN_PATH = '/_token'
app.all('*', async (req, res, next) => {
  if (req.path.indexOf(ADMIN_TOKEN_PATH) > -1) {
    //变量名.indexOf(要找到的内容)找到就大于1
    // token的验证
    let { token } = req.headers
    let admin_token_sql = 'SELECT * FROM `admin` WHERE `token`=?'
    let adminResult = await db.async.all(admin_token_sql, [token])
    if (adminResult.err != null || adminResult.rows.length == 0) {
      res.send({
        code: 403,
        msg: '请先登录',
      })
      return
    } else {
      next()
    }
  } else {
    next()
  }
})

//引入路由
//app.use(定义的接口名字,require(中间件文件路径))
app.use('/test', require('./routers/TestRouter'))
app.use('/admin', require('./routers/AdminRouter'))
app.use('/categorty', require('./routers/CategoryRouter'))
app.use('/blog', require('./routers/BlogRouter'))
app.use('/upload', require('./routers/UploadRouter'))

app.get('/', (req, res) => {
  res.send('hello world')
})

app.listen(port, () => {
  console.log(`启动成啦: http://localhost:${port}/`)
  // 这里注意是`` 这个，不是单引号
})

//app.js 这个文件一旦有写错语法，不一定有提醒，但会一直刷新不出来页面
